package com.malou.client.ventas.cliente;

import java.util.ArrayList;
import java.util.List;

import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.filters.GridFilters;
import com.extjs.gxt.ui.client.widget.grid.filters.NumericFilter;
import com.extjs.gxt.ui.client.widget.grid.filters.StringFilter;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.malou.client.MalouConstants;
import com.malou.client.MalouMessages;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.direccioncliente.DireccionClientePanel;
import com.malou.client.ventas.direccioncliente.DireccionClientes;

public class ClientePanel extends ContentPanel {

	ClienteDialog dialog;
	private BeanModel selectedModel;
	private Button editCliente;
	private Button deleteCliente;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	private MalouMessages messages = GWT.create(MalouMessages.class);
	private List<BeanModel> selectedModels;
	private Integer selectedSize;
	private ToolBar toolBar;
	private Button addCliente;
	private SeparatorToolItem separatorAdd;
	private SeparatorToolItem separatorEdit;
    public static DireccionClientePanel dcpanel;  
	public ClientePanel() {
		super();
		setFrame(true);
		setCollapsible(true);
		setAnimCollapse(false);
		setIcon(IconHelper.createPath("images/icons/table.png"));
		setHeading(constants.clienteListaClientes());
		setLayout(new FitLayout());
		setHeaderVisible(true);
		
		Clientes.getPaginate();
	     
		final PagingToolBar toolBarPag = new PagingToolBar(	Utilities.itemsPerPage);
		toolBarPag.bind(Clientes.loader);

		List<ColumnConfig> columns = new ArrayList<ColumnConfig>();

		final CheckBoxSelectionModel<BeanModel> sm = new CheckBoxSelectionModel<BeanModel>();

		columns.add(sm.getColumn());
		columns.add(new ColumnConfig("apellidos", constants.clienteApellidos(),	150));
		columns.add(new ColumnConfig("nombres", constants.clienteNombres(), 150));
		columns.add(new ColumnConfig("dni", constants.clienteDni(), 70));		
		columns.add(new ColumnConfig("telefono", constants.clienteTelefono(), 80));
		columns.add(new ColumnConfig("celular", constants.clienteCelular(), 80));
		columns.add(new ColumnConfig("email", constants.clienteEmail(), 150));
		columns.add(new ColumnConfig("razonsocial", constants.clienteRazonSocial(), 150));
		columns.add(new ColumnConfig("ruc", constants.clienteRuc(), 80));
		columns.add(new ColumnConfig("montoacumulado", constants.clienteMontoCompra(), 80));
		columns.add(new ColumnConfig("tipocliente", constants.tipocliente(), 80));

		ColumnModel cm = new ColumnModel(columns);

		Grid<BeanModel> grid = new Grid<BeanModel>(Clientes.store, cm);
		grid.addListener(Events.Attach, new Listener<GridEvent<BeanModel>>() {
			public void handleEvent(GridEvent<BeanModel> be) {
				Clientes.loader.load(0, Utilities.itemsPerPage);
			}
		});
		grid.addPlugin(sm);
		grid.setLoadMask(true);
		grid.setBorders(true);

		

		toolBar = new ToolBar();
		dialog = new ClienteDialog();
		dialog.setStore(Clientes.store);
		
		addCliente = new Button(constants.agregar(),IconHelper.createPath("images/icons/new.gif"));
		addCliente.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				dialog.reset();
				dialog.unbind();
				dialog.show();
			}
		});
		
		toolBar.add(addCliente);
		toolBar.add(new SeparatorToolItem());
		deleteCliente = new Button(constants.eliminar(),IconHelper.createPath("images/icons/delete.gif"));
		deleteCliente.setEnabled(false);
		final Listener<MessageBoxEvent> l = new Listener<MessageBoxEvent>() {
			public void handleEvent(MessageBoxEvent ce) {
				String button_id = ce.getButtonClicked().getItemId();
				if (Dialog.YES == button_id) {
					Clientes.clienteDialog = dialog;

					if (selectedSize == 1) {
						Integer id = selectedModel.get("id");
						Clientes.delete(id);
					} else if (selectedSize > 1) {
						String ids = Utilities.toIds(selectedModels);
						Clientes.deleteAll(ids);
					}
				}
			}
		};

		SelectionListener<ButtonEvent> sl_delete;
		sl_delete = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				String mensaje = "";
				if (selectedSize == 1) {
					String apellidos = selectedModel.get("apellidos");
					String nombres = selectedModel.get("nombres");

					mensaje = messages.clienteEstaSeguro(nombres, apellidos);
				} else if (selectedSize > 1) {
					mensaje = constants.eliminarAll();
				}
				MessageBox.confirm(constants.confirmacion(), mensaje, l)
						.getDialog().getButtonById(Dialog.YES)
						.setText(constants.si());

			}

		};

		deleteCliente.addSelectionListener(sl_delete);
		toolBar.add(deleteCliente);
		separatorEdit = new SeparatorToolItem();
		toolBar.add(separatorEdit);

		editCliente = new Button(constants.editar(),IconHelper.createPath("images/icons/update.png"));
		editCliente.setEnabled(false);
		editCliente.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				dialog.bind(selectedModel);
				dialog.beforeEdit();
				dialog.show();
			}
		
		});
		toolBar.add(editCliente);
		

		grid.setSelectionModel(sm);
		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						selectedSize = be.getSelection().size();
						if (selectedSize == 0) {
							editCliente.setEnabled(false);
							dialog.unbind();
							deleteCliente.setEnabled(false);
							DireccionClientes.store.removeAll();
							dcpanel.addCliente.setEnabled(false);
						} else if (selectedSize == 1) {
							selectedModel = be.getSelectedItem();
							DireccionClientes.cliente_id=be.getSelectedItem().get("id");
							DireccionClientes.loader.load();
							dialog.bind(selectedModel);
							editCliente.setEnabled(true);
							deleteCliente.setEnabled(true);
							dcpanel.addCliente.setEnabled(true);
						} else if (selectedSize > 1) {
							DireccionClientes.store.removeAll();
							selectedModels = be.getSelection();
							editCliente.setEnabled(false);
							dialog.unbind();
							deleteCliente.setEnabled(true);
							dcpanel.addCliente.setEnabled(false);
						}
					}

				});

		GridFilters filters = new GridFilters();
		filters.getMessages().setFilterText(constants.filtros());

		StringFilter apellidosFilter = new StringFilter("apellidos");
		StringFilter nombresFilter = new StringFilter("nombres");
		StringFilter direccionFilter = new StringFilter("direccion");
		StringFilter rucFilter = new StringFilter("ruc");
		StringFilter telefonoFilter = new StringFilter("telefono");
		StringFilter celularFilter = new StringFilter("celular");
		StringFilter emailFilter = new StringFilter("email");
		StringFilter razonsocialFilter = new StringFilter("razonsocial");
		StringFilter dni = new StringFilter("dni");
		
		
		filters.addFilter(apellidosFilter);
		filters.addFilter(nombresFilter);
		filters.addFilter(direccionFilter);
		filters.addFilter(rucFilter);
		filters.addFilter(telefonoFilter);
		filters.addFilter(celularFilter);
		filters.addFilter(emailFilter);
		filters.addFilter(razonsocialFilter);
		filters.addFilter(dni);
		filters.addFilter(new NumericFilter("montoacumulado"));
		filters.addFilter(new StringFilter("tipocliente"));
		grid.addPlugin(filters);
		
		setBottomComponent(toolBarPag);
		setTopComponent(toolBar);
		add(grid);
		
	}

	public void setPermisos(List<String> permisos) {

		boolean add = permisos.contains("add");
		boolean edit = permisos.contains("edit");
		boolean delete = permisos.contains("delete");

		if (!add && !edit && !delete) {
			toolBar.setVisible(false);
		} else {
			if (!add) {
				addCliente.setVisible(false);
				separatorAdd.setVisible(false);
			}
			if (!edit) {
				editCliente.setVisible(false);
				separatorEdit.setVisible(false);
			}
			if (!delete)
				deleteCliente.setVisible(false);
		}
	}
}